import { Request, Response, NextFunction } from 'express';
import ApiResponse from '@/utils/api/api-response.util';
import { isEmpty } from '../common/validation.util';
import deptService from '@/services/system/dept.service';
import { getLogger } from '@/utils/logger';
import { AuthRequest } from '@/types';

const logger = getLogger('dept-validator', { console: false });
const consoleLogger = getLogger('dept-validator');

/**
 * 验证部门创建参数
 */
export const validateDeptCreate = async (req: Request, res: Response, next: NextFunction) => {
  try {
    const { deptName, parentId } = req.body;
    
    // 部门名称验证
    if (isEmpty(deptName)) {
      return ApiResponse.error(res, '部门名称不能为空', 400);
    }
    
    // 父部门ID验证
    const pId = parentId !== undefined ? parseInt(parentId) : 0;
    
    // 校验部门名称是否唯一
    if (!(await deptService.checkDeptNameUnique(deptName, pId))) {
      consoleLogger.warn('新增部门失败: 部门名称已存在', { deptName, parentId: pId });
      return ApiResponse.error(res, '新增部门失败，部门名称已存在', 400);
    }
    
    logger.debug('部门创建参数验证通过');
    next();
    return;
  } catch (error) {
    consoleLogger.error(`部门创建验证失败: ${error instanceof Error ? error.message : String(error)}`);
    return ApiResponse.error(res, '参数验证失败', 500);
  }
};

/**
 * 验证部门更新参数
 */
export const validateDeptUpdate = async (req: Request, res: Response, next: NextFunction) => {
  try {
    const { deptId, deptName, parentId } = req.body;
    
    if (isEmpty(deptId) || isNaN(parseInt(deptId))) {
      return ApiResponse.error(res, '部门ID不能为空', 400);
    }
    
    if (isEmpty(deptName)) {
      return ApiResponse.error(res, '部门名称不能为空', 400);
    }
    
    const dId = parseInt(deptId);
    const pId = parentId !== undefined ? parseInt(parentId) : 0;
    
    // 校验部门是否存在
    const dept = await deptService.selectDeptById(dId);
    if (!dept) {
      logger.warn('修改部门失败: 部门不存在', { deptId: dId });
      return ApiResponse.error(res, '修改部门失败，部门不存在', 400);
    }
    
    // 校验部门名称是否唯一
    if (!(await deptService.checkDeptNameUnique(deptName, pId, dId))) {
      logger.warn('修改部门失败: 部门名称已存在', { deptName, parentId: pId });
      return ApiResponse.error(res, '修改部门失败，部门名称已存在', 400);
    }
    
    // 上级部门不能是自己或自己的子部门
    if (dId === pId) {
      return ApiResponse.error(res, '修改部门失败，上级部门不能是自己', 400);
    }
    
    // 获取所有子部门ID
    const childDepts = await deptService.selectChildrenDeptById(dId);
    const childIds = childDepts.map(d => d.deptId);
    
    // 上级部门不能是自己的子部门
    if (childIds.includes(pId)) {
      return ApiResponse.error(res, '修改部门失败，上级部门不能是当前部门的子部门', 400);
    }
    
    logger.debug('部门更新参数验证通过');
    next();
    return;
  } catch (error) {
    consoleLogger.error(`部门更新验证失败: ${error instanceof Error ? error.message : String(error)}`);
    return ApiResponse.error(res, '参数验证失败', 500);
  }
};

/**
 * 验证部门删除参数
 */
export const validateDeptRemove = async (req: AuthRequest, res: Response, next: NextFunction) => {
  try {
    const deptId = parseInt(req.params.deptId);
    
    if (isNaN(deptId) || deptId <= 0) {
      return ApiResponse.error(res, '部门ID无效', 400);
    }
    
    // 校验部门是否存在
    const dept = await deptService.selectDeptById(deptId);
    if (!dept) {
      logger.warn('删除部门失败: 部门不存在', { deptId });
      return ApiResponse.error(res, '删除部门失败，部门不存在', 400);
    }
    
    // 校验是否存在子部门
    if (await deptService.hasChildByDeptId(deptId)) {
      logger.warn('删除部门失败: 存在下级部门', { deptId });
      return ApiResponse.error(res, '删除部门失败，存在下级部门', 400);
    }
    
    // 校验是否存在用户
    if (await deptService.checkDeptExistUser(deptId)) {
      logger.warn('删除部门失败: 部门存在用户', { deptId });
      return ApiResponse.error(res, '删除部门失败，部门存在用户', 400);
    }
    
    logger.debug('部门删除参数验证通过');
    next();
    return;
  } catch (error) {
    consoleLogger.error(`部门删除验证失败: ${error instanceof Error ? error.message : String(error)}`);
    return ApiResponse.error(res, '参数验证失败', 500);
  }
}; 